#ifndef ML_WEAK_LEANER_H_
#define ML_WEAK_LEANER_H_

#include "ZMLAlgorithm.h"

GLOBAL_NAMESPACE_BEGIN
NAMESPACE_MACHINE_LEARNING_BEGIN

class MLWeakLearner
{
public:
    MLWeakLearner(){}
    ~MLWeakLearner(){}

    // training
    virtual int     train(const Eigen::MatrixXd& trainData, const Eigen::MatrixXi& labels, const Eigen::MatrixXd& weights) = 0;
    virtual double  evalError(const Eigen::MatrixXd& data, const Eigen::MatrixXi& labels, const Eigen::MatrixXd& weights) const = 0;

    // predict
    virtual Eigen::RowVectorXi     predict(const Eigen::RowVectorXd& oneData) const = 0;
    virtual double  evaluate(const Eigen::RowVectorXd& oneData, int classIdx) const = 0;
    virtual double  evaluate(const Eigen::MatrixXd& data, int dataIdx, int classIdx) const = 0;
    virtual int     getLabelResponse(const Eigen::RowVectorXi& oneLabel, int classIdx) const {return 0;}

    // IO
    virtual void output(std::ostream& out){}

};

static std::ostream& operator<<(std::ostream& out, MLWeakLearner* learner)
{
    learner->output(out);
    return out;
}

NAMESPACE_MACHINE_LEARNING_END
GLOBAL_NAMESPACE_END

#endif//ML_WEAK_LEANER_H_